home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
vla
/
wcimit
/
cmpsub.asm
next >
Wrap
Assembly Source File
|
1993-06-03
|
4KB
|
164 lines
DOSSEG
.286
.MODEL SMALL
.CODE
ASSUME cs:@code, ds:@code
;====- DATA -=====
;
;upon entry: Decompressit => loads .CMP image and decompresses it...
;
;* DS:DX = pointer to filename
;* AX != 0, image fitted to AX wide window
;* AX == 0, image decompressed using [Xsize] for width
;* [FileSeg] and [Destination] must both have valid segmnet values
;
;upon EXIT:
;
;* AX=0 if no error, 1 means error
;* Stuff in [FileSeg] is destoryed
;* Decompressed image is in [Destination] segment
;* Palette is at CmpPal
;
GLOBAL DeCompressIt:NEAR
GLOBAL FileSeg:WORD, Destination:WORD, CmpPal:BYTE
FileSeg dw 0
Destination dw 0
CmpPal db 0,767 dup (0)
Xsize dw 0
Ysize dw 0
Repeatcode db 0
ScreenWidth dw 320
SegMsg db "FATAL! You forgot to load [FileSeg] and/or [Destination]!!$"
FileMsg db "FATAL! File was not openable! (Probably not found.)$"
;========- SubRoutines -========
DeCompressit proc near
pusha
push ds es
cmp cs:[FileSeg],0
je SegError
cmp cs:[Destination],0
je SegError
push ax
mov ax,cs
mov es,ax
mov ax,3d00h ;open file
int 21h
jnc Noabort
pop ax
popa
mov ax,1 ;1 means file error
ret
SegError:
mov ax,cs
mov ds,ax
mov ah,9
mov dx,offset SegMsg
int 21h
popa
mov ax,2 ;2 means segment error
ret
Noabort:
mov bx,ax
mov ax,cs:[FileSeg]
mov ds,ax
mov ax,cs:[Destination]
mov es,ax
mov cx,0ffffh ;read whole file ( if < 64k )
xor dx,dx
mov ah,3fh
int 21h
mov ah,3eh ;close source file
int 21h
mov al,ds:[3] ;read 4th byte (offset 3)
mov cs:[repeatcode],al
mov ax,ds:[4] ;xsize
mov cs:[xsize],ax
mov ax,ds:[6]
mov cs:[ysize],ax
pop ax ;from push up top
mov cs:[ScreenWidth],ax
or ax,ax
jne WidthAx ;see if we use AX or Xsize
mov ax,cs:[Xsize] ;use Xsize
mov cs:[ScreenWidth],ax
WidthAX:
xor di,di
mov si,776
mov cx,cs:[xsize]
mov bx,cs:[ysize]
mov dl,cs:[repeatcode]
push di
TryAgain:
lodsb
cmp al,dl ;is byte a repeatcode?
je decodeloop ;yup do decode loop
stosb ;nope, it's a pixel, store it
jumphere:
dec cx ;are we done with this line?
jne tryagain ;no, do another
mov cx,cs:[xsize]
pop di
add di,cs:[ScreenWidth]
push di
dec bx ;are we done with height?
jne tryagain ;nope go on
jmp alldone ;Yup, exit out
DECODELOOP:
lodsw ;ah=# of times: al= byte to repeat
stosb
jmp dcskip
Bigloop:
stosb
dec ah ;are we done with this repeat sequence?
je jumphere ;yup, go back up top
dcskip:
dec cx ;are we done with this line?
jne Bigloop
mov cx,cs:[xsize]
pop di
add di,cs:[ScreenWidth]
push di
dec bx ;are we done with the picture?
jne Bigloop ;nope, keep going...
jmp alldone ;yup
AllDone:
pop di ;pull garbage di off stack
mov ax,cs
mov es,ax ;copy palette to CmpPal
mov si,8
mov di,offset CmpPal
mov cx,768/2
rep movsw
pop es ds
popa
mov ax,0 ;operation was successful
ret
DeCompressit endp
end